{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6a3b75db-2a98-4777-beaa-c6e45329e74a",
   "metadata": {},
   "source": [
    "# Oracle generation for 3-SAT problems"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1cbc658-28e8-4dbf-b6e2-b75fa4202594",
   "metadata": {},
   "source": [
    "This notebook demonstrates Classiq's capabilities in the framework of phase oracles. The focus is 3-SAT problems on a growing number of variables. To highlight the advantage of generation times, we skip transpilation for the synthesis output."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f1e9b60-25ae-48d8-ae4e-7ed4d33099da",
   "metadata": {},
   "source": [
    "The following utility functions generate random 3-SAT problems for $N$ boolean variables, consisting of $N$ clauses."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c621f5a7-e523-419c-a15e-b029bb37dc1e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "from classiq.qmod.symbolic import logical_and, logical_not, logical_or\n",
    "\n",
    "\n",
    "def generate_permutation_for_3sat_expression(num_qubits, max_samples=1000):\n",
    "    \"\"\"\n",
    "    A function that generates two permutations on a list of num_qubits variables,\n",
    "    for introducing a random and valid 3-SAT problem\n",
    "    \"\"\"\n",
    "\n",
    "    direct_arr = np.array([k for k in range(num_qubits)])\n",
    "    for k in range(max_samples):\n",
    "        permut1 = np.random.permutation(num_qubits)\n",
    "        permut2 = np.random.permutation(num_qubits)\n",
    "        if (\n",
    "            (0 not in permut2 - direct_arr)\n",
    "            and (0 not in permut1 - direct_arr)\n",
    "            and (0 not in permut1 - permut2)\n",
    "        ):\n",
    "            break\n",
    "\n",
    "    assert (\n",
    "        k < max_samples\n",
    "    ), \"Could not find a random 3-SAT problem, try to increase max_samples\"\n",
    "    return direct_arr, permut1, permut2\n",
    "\n",
    "\n",
    "def generate_3sat_qbit_expression(vars, s0, s1, s2):\n",
    "    \"\"\"\n",
    "    A function that generates a 3-SAT problem on a list of QBit variables.\n",
    "    The returned expression contains num_qubits=len(vars) clauses and contains\n",
    "    triplets of the form (x_k or ~x_s1(k) or x_s2(k)), where s1, s2 are permutations.\n",
    "    \"\"\"\n",
    "\n",
    "    num_qubits = len(vars)\n",
    "    k = 0\n",
    "    y = logical_or(logical_or(vars[s0[k]], logical_not(vars[s1[k]])), vars[s2[k]])\n",
    "    for k in range(1, num_qubits):\n",
    "        temp = logical_or(\n",
    "            logical_or(vars[s0[k]], logical_not(vars[s1[k]])), vars[s2[k]]\n",
    "        )\n",
    "        y = logical_and(y, temp)\n",
    "    return y"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9f70e5ac-adf7-480b-a635-e21d2cf70cf4",
   "metadata": {},
   "source": [
    "## 1. Generating Phase Oracles"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "817f5bd4-5a60-4da6-ae9e-5ef92192aa3b",
   "metadata": {},
   "source": [
    "For each 3-SAT problem we generate an oracle with Classiq and save the generation time, as well as the circuits' width. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1b05a367-6ce5-4289-ab5e-712ab58a28f3",
   "metadata": {},
   "outputs": [],
   "source": [
    "from classiq import (\n",
    "    Constraints,\n",
    "    H,\n",
    "    OptimizationParameter,\n",
    "    Output,\n",
    "    Preferences,\n",
    "    QNum,\n",
    "    QuantumProgram,\n",
    "    X,\n",
    "    allocate,\n",
    "    create_model,\n",
    "    qfunc,\n",
    "    set_constraints,\n",
    "    set_preferences,\n",
    "    synthesize,\n",
    "    within_apply,\n",
    ")\n",
    "\n",
    "\n",
    "def get_generation_time_classiq(s0, s1, s2, num_qubits):\n",
    "\n",
    "    start_cl = time.time()\n",
    "\n",
    "    @qfunc\n",
    "    def main():\n",
    "\n",
    "        def inner_call(aux: QNum):\n",
    "            aux ^= generate_3sat_qbit_expression(\n",
    "                [dict_of_qnums[f\"x{k}\"] for k in range(num_qubits)], s0, s1, s2\n",
    "            )\n",
    "\n",
    "        dict_of_qnums = {f\"x{k}\": QNum(f\"x{k}\") for k in range(num_qubits)}\n",
    "        for k in range(num_qubits):\n",
    "            allocate(1, dict_of_qnums[f\"x{k}\"])\n",
    "        aux = QNum(\"aux\")\n",
    "        allocate(1, aux)\n",
    "        within_apply(\n",
    "            lambda: (X(aux), H(aux)),\n",
    "            lambda: inner_call(aux),\n",
    "        )\n",
    "\n",
    "    qmod = create_model(main)\n",
    "    qmod = set_preferences(qmod, preferences=Preferences(transpilation_option=\"none\"))\n",
    "    qprog = synthesize(qmod)\n",
    "    cir = QuantumProgram.from_qprog(qprog)\n",
    "\n",
    "    return cir.data.width, time.time() - start_cl"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f149743e-991e-42e0-a0ab-cdbe403811d3",
   "metadata": {},
   "source": [
    "The following function generates a phase oracle with qiskit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ac97d11a-dea7-4733-ac6e-2bb410b03e0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_generation_time_qiskit(s0, s1, s2, num_qubits):\n",
    "\n",
    "    start_qs = time.time()\n",
    "    dict_of_qnums = {f\"x{k}\": QNum(f\"x{k}\") for k in range(num_qubits)}\n",
    "    expression = str(\n",
    "        generate_3sat_qbit_expression(\n",
    "            [dict_of_qnums[f\"x{k}\"] for k in range(num_qubits)], s0, s1, s2\n",
    "        )\n",
    "    )\n",
    "    expression = expression.replace(\"or\", \"|\")\n",
    "    expression = expression.replace(\"not\", \"~\")\n",
    "    expression = expression.replace(\"and\", \"&\")\n",
    "    oracle = PhaseOracle(expression, var_order=None)\n",
    "    q = QuantumRegister(num_qubits)\n",
    "    qc = QuantumCircuit(q)\n",
    "    qc.append(oracle, q[:])\n",
    "\n",
    "    return time.time() - start_qs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2605e66c-67cb-47dd-b96a-6bef3782c983",
   "metadata": {},
   "source": [
    "*For generating the same data with Qiskit please uncomment the commented lines (including the `pip install command`).* We work with qiskit version 1.0.0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "068d534e-4c91-4d05-aad5-4c15ec155390",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "from qiskit import QuantumCircuit, QuantumRegister, transpile\n",
    "from qiskit.circuit.library import PhaseOracle\n",
    "\n",
    "from classiq import CustomHardwareSettings, Preferences, RegisterUserInput, synthesize"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c532edaa-0fa8-4a59-b487-dca996bcdbb5",
   "metadata": {},
   "source": [
    "We skip generating data with Qiskit for $N>23$, as generation times exponentially diverge with the number of variables.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4ba6bda7-efdd-49ba-a922-7921bc19d1e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(128)\n",
    "cl_times = []\n",
    "num_qubits_list = [k for k in range(10, 23)] + [\n",
    "    int(l) for l in np.logspace(np.log2(24), np.log2(68), 10, base=2)\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6a4ae795-8aa5-4458-b2d4-1df3101a0401",
   "metadata": {},
   "outputs": [],
   "source": [
    "# from importlib.metadata import version\n",
    "# try:\n",
    "#     import qiskit\n",
    "#     if version('qiskit') != \"1.0.0\":\n",
    "#       !pip uninstall qiskit -y\n",
    "#       !pip install qiskit==1.0.0\n",
    "# except ImportError:\n",
    "#     !pip install qiskit==1.0.0\n",
    "\n",
    "# ! pip install tweedledum\n",
    "# qs_times = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "2ab265da-36d3-44ea-86f6-54a4cbaf3ebd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num_qubits: 10\n",
      "classiq_width: 21 ,   classiq_time: 2.2342519760131836\n",
      "num_qubits: 11\n",
      "classiq_width: 24 ,   classiq_time: 2.1264989376068115\n",
      "num_qubits: 12\n",
      "classiq_width: 26 ,   classiq_time: 2.1227452754974365\n",
      "num_qubits: 13\n",
      "classiq_width: 28 ,   classiq_time: 2.1253809928894043\n",
      "num_qubits: 14\n",
      "classiq_width: 30 ,   classiq_time: 2.1289098262786865\n",
      "num_qubits: 15\n",
      "classiq_width: 32 ,   classiq_time: 2.14056396484375\n",
      "num_qubits: 16\n",
      "classiq_width: 34 ,   classiq_time: 2.1414260864257812\n",
      "num_qubits: 17\n",
      "classiq_width: 36 ,   classiq_time: 2.218695878982544\n",
      "num_qubits: 18\n",
      "classiq_width: 38 ,   classiq_time: 2.173229694366455\n",
      "num_qubits: 19\n",
      "classiq_width: 40 ,   classiq_time: 2.148393154144287\n",
      "num_qubits: 20\n",
      "classiq_width: 42 ,   classiq_time: 2.153247833251953\n",
      "num_qubits: 21\n",
      "classiq_width: 44 ,   classiq_time: 2.158281087875366\n",
      "num_qubits: 22\n",
      "classiq_width: 46 ,   classiq_time: 2.3974831104278564\n",
      "num_qubits: 24\n",
      "classiq_width: 50 ,   classiq_time: 3.242741107940674\n",
      "num_qubits: 26\n",
      "classiq_width: 54 ,   classiq_time: 3.197925090789795\n",
      "num_qubits: 30\n",
      "classiq_width: 62 ,   classiq_time: 4.215781211853027\n",
      "num_qubits: 33\n",
      "classiq_width: 68 ,   classiq_time: 4.2895119190216064\n",
      "num_qubits: 38\n",
      "classiq_width: 78 ,   classiq_time: 5.261475086212158\n",
      "num_qubits: 42\n",
      "classiq_width: 86 ,   classiq_time: 6.337763071060181\n",
      "num_qubits: 48\n",
      "classiq_width: 98 ,   classiq_time: 8.315266847610474\n",
      "num_qubits: 53\n",
      "classiq_width: 108 ,   classiq_time: 10.428596019744873\n",
      "num_qubits: 60\n",
      "classiq_width: 122 ,   classiq_time: 13.609048128128052\n",
      "num_qubits: 67\n",
      "classiq_width: 136 ,   classiq_time: 17.594478130340576\n"
     ]
    }
   ],
   "source": [
    "for l in num_qubits_list:\n",
    "    num_qubits = l\n",
    "    print(\"num_qubits:\", num_qubits)\n",
    "    s0, s1, s2 = generate_permutation_for_3sat_expression(num_qubits)\n",
    "\n",
    "    cl_width, classiq_generation_time = get_generation_time_classiq(\n",
    "        s0, s1, s2, num_qubits\n",
    "    )\n",
    "    cl_times.append(classiq_generation_time)\n",
    "    print(\"classiq_width:\", cl_width, \",   classiq_time:\", classiq_generation_time)\n",
    "\n",
    "    # if l<23:\n",
    "    #     qiskit_generation_time = get_generation_time_qiskit(s0, s1, s2, num_qubits)\n",
    "    #     qs_times.append(qiskit_generation_time)\n",
    "    #     print(\"qiskit_time:\", qiskit_generation_time)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7989178b-c5e2-459e-aa14-6706e71d3929",
   "metadata": {},
   "source": [
    "## 2. Plotting the Data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c0229906-6bae-4cd2-a45a-9ec1089c3f67",
   "metadata": {},
   "source": [
    "Since generating the data takes time we hard-coded the Qiskit results in the notebook. If you run this notebook by yourself please comment out the following cell."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "542b49f3-ddfa-4009-8c4d-e4303754698e",
   "metadata": {},
   "outputs": [],
   "source": [
    "qs_times = [\n",
    "    0.23147010803222656,\n",
    "    0.2850170135498047,\n",
    "    2.6256730556488037,\n",
    "    0.75693678855896,\n",
    "    5.783859968185425,\n",
    "    3.3723957538604736,\n",
    "    3.9280269145965576,\n",
    "    39.92809295654297,\n",
    "    60.67643904685974,\n",
    "    16.551968097686768,\n",
    "    31.536834955215454,\n",
    "    31.086618900299072,\n",
    "    794.9081449508667,\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ccfd2c91-49fc-4ba0-b66f-c18db8354e82",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03]),\n",
       " [Text(0.1, 0, '$\\\\mathdefault{10^{-1}}$'),\n",
       "  Text(1.0, 0, '$\\\\mathdefault{10^{0}}$'),\n",
       "  Text(10.0, 0, '$\\\\mathdefault{10^{1}}$'),\n",
       "  Text(100.0, 0, '$\\\\mathdefault{10^{2}}$'),\n",
       "  Text(1000.0, 0, '$\\\\mathdefault{10^{3}}$')])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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mBACxcXFWh3j4OAAmUxWSxERERGZFiZSZqy4uBhOTk5aHVNUVARHR8daioiIiMi08NYeERERkUS8IkUAgClR12Ftq/5KU3npXWwMb1LHERERERk/JlIEALC2dYS1HW/ZERERaYOJlJ5wrT0iIiLzw0RKT7jWHhERkfnhZHMiIiIiiXhFysix1hMREZHxYiJl5FjriYiIyHgxkSIAD0ocSNlHRERkzphImZDarPXEOlFERETaYyJlQljriYiIyLgwkTJjDg4OKCoq0voYIiIieoCJlBmTyWSclE5ERKQD1pEiIiIikoiJFBEREZFETKSIiIiIJOIcKRPCWk9ERETGhYmUCWGtJyIiIuPCW3tEREREEvGKlJ5ERUUhKipKZXtJSYlO/bLWExERkfFiIqUn4eHhCA8PV9mekpICf39/yf2y1hMREZHx4q09IiIiIomYSBERERFJxESKiIiISCImUkREREQSMZEiIiIikoiJFBEREZFETKSIiIiIJGIiRURERCQRC3LWMnll8wsXLhg4EiIiItKU/He7phVKmEjVsszMTADAuHHjDBsIERERaS0zMxO9evWqcr9MCCHqMB6zc+PGDSQkJMDHxwf29vZ667eoqAhBQUE4dOgQnJyc9NYvkS5GjRqFmJgYQ4dhtnj+ldXH82FK78kYY9UmppKSEmRmZmLgwIFwd3evsh0TKRNVWFgIV1dXFBQUwMXFxdDhEAEAOnbsiPPnzxs6DLPF86+sPp4PU3pPxhhrbcTEyeZEREREEjGRIiIiIpKIiRQRERGRREykiIiIiCRiImWibG1tsWTJEtja2ho6FCKF8PBwQ4dg1nj+ldXH82FK78kYY62NmPjUHhEREZFEvCJFREREJBETKSIiIiKJmEgRERERScREysycOnUKrVq1woQJEwwdClG10tPTERYWhjFjxhg6FLPE86+K58SwjPX8M5EyI5GRkXjhhRdw8+ZNQ4dCVKMTJ05g0KBBhg7DbPH8q+I5MSxjPf9MpMxEVlYWEhMTceLECTRs2NDQ4ZCBfP/99xgwYACCg4MREBCAZ599FpmZmXofp6ysDPPmzYOVlVWV/f/4448ICAjAU089haCgIJw7d05p/9ixY+tdeY+dO3di8ODBCA4ORu/eveHn54ft27frfRxTPf8bNmyATCbDwYMH9d63qZ6TupCeno5Ro0ahX79+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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "classiq_color = \"#D7F75B\"\n",
    "qiskit_color = \"#6FA4FF\"\n",
    "plt.rcParams[\"font.family\"] = \"serif\"\n",
    "plt.rc(\"savefig\", dpi=300)\n",
    "\n",
    "plt.rcParams[\"axes.linewidth\"] = 1\n",
    "plt.rcParams[\"xtick.major.size\"] = 5\n",
    "plt.rcParams[\"xtick.minor.size\"] = 5\n",
    "plt.rcParams[\"ytick.major.size\"] = 5\n",
    "plt.rcParams[\"ytick.minor.size\"] = 5\n",
    "\n",
    "\n",
    "plt.loglog(\n",
    "    [n for n in num_qubits_list if n < 23],\n",
    "    qs_times,\n",
    "    \"s\",\n",
    "    label=\"qiskit\",\n",
    "    markerfacecolor=qiskit_color,\n",
    "    markeredgecolor=\"k\",\n",
    "    markersize=7,\n",
    "    markeredgewidth=1.5,\n",
    "    linewidth=1.5,\n",
    "    color=qiskit_color,\n",
    ")\n",
    "plt.loglog(\n",
    "    num_qubits_list,\n",
    "    cl_times,\n",
    "    \"o\",\n",
    "    label=\"classiq\",\n",
    "    markerfacecolor=classiq_color,\n",
    "    markeredgecolor=\"k\",\n",
    "    markersize=8.5,\n",
    "    markeredgewidth=1.5,\n",
    "    linewidth=1.5,\n",
    "    color=classiq_color,\n",
    ")\n",
    "\n",
    "plt.legend(fontsize=16, loc=\"upper right\")\n",
    "\n",
    "\n",
    "plt.ylabel(\"generation time [sec]\", fontsize=16)\n",
    "plt.xlabel(\"number of variables\", fontsize=16)\n",
    "plt.yticks(fontsize=16)\n",
    "plt.xticks(fontsize=16)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
